/**
 * 文档类基类
 * ibio-develop
 * 2010-8-13 14:50
 */
package com.ibio8.utils {
	import flash.display.MovieClip;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.utils.setTimeout;
	import flash.utils.clearTimeout;
	/**
	 * 文档类基类。
	 * 
	 * <p>
	 * swf 初始化文档类基类。
	 * </p>
	 */
	public class BaseDocument extends MovieClip {
		/** @private **/
		protected static const CHECK_TIME:Number = 0.05;
		/** @private **/
		protected static const ADD_STAGE:String = "addStage";
		/** @private **/
		protected static const ON_LOADED:String = "onLoaded";
		/** @private **/
		protected static const CHECK_STAGE_SIZE:String = "checkStageSize";
		/** @private **/
		protected var m_completeFlag:Object = {};
		/** @private **/
		protected var m_checkLoaded:uint;
		
		/**
		 * 构造函数
		 */
		public function BaseDocument() {
			if (this.stage) {
				onAddToStageHandler();
			}else {
				this.addEventListener(Event.ADDED_TO_STAGE, onAddToStageHandler);
			}
			//加载
			this.loaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
			onCompleteHandler();
		}
		
		/**
		 * 添加到舞台上的回调函数
		 * @param	e	Flash 事件（Event）
		 */
		protected function onAddToStageHandler(e:Event = null):void {
			this.removeEventListener(Event.ADDED_TO_STAGE, onAddToStageHandler);
			//初始化舞台
			this.stage.align = StageAlign.TOP_LEFT;
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			checkStageSize();
			checkReady(ADD_STAGE);
		}
		
		/**
		 * 此 swf 加载完毕时的回调函数
		 * @param	e	Flash 事件（Event）
		 * <p>注意：因为在 FF 下，当 FLASH 被缓存到本地时，
		 * 有可能call不到 onCompleteHandler，所以这里多加一个 setTimeout</p>
		 */
		protected function onCompleteHandler(e:Event = null):void {
			if (this.loaderInfo.bytesLoaded < this.loaderInfo.bytesTotal) {
				m_checkLoaded = setTimeout(onCompleteHandler, CHECK_TIME * 1000);
			}else {
				clearTimeout(m_checkLoaded);
				this.loaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler);
				checkReady(ON_LOADED);
			}
		}
		
		/**
		 * 检测舞台的宽高是否存在
		 * <p>因为在目前的版本 11 之前，在 ie 浏览器下可能会存在当 swf 有缓存时，
		 * 再次加载时一开始可能获取的 stage.stageWidth、stage.stageHeight 值为 0</p>
		 */
		protected function checkStageSize():void {
			if ((this.stage.stageWidth > 0) && (this.stage.stageHeight > 0)) {
				checkReady(CHECK_STAGE_SIZE);
			}else {
				setTimeout(checkStageSize, CHECK_TIME * 1000);
			}
		}
		
		/**
		 * 检查此 swf 是否加载完毕，且已经加载到舞台上
		 * @param	flag	当前是哪种状态
		 * <b>因为是有可能被其他的程序加载，所以这里需要检查一次</b>
		 */
		protected function checkReady(flag:String):void {
			m_completeFlag[flag] = true;
			if (m_completeFlag[ADD_STAGE] && m_completeFlag[ON_LOADED] && m_completeFlag[CHECK_STAGE_SIZE]) {
				m_completeFlag = {};
				initialize();
			}
		}
		
		/**
		 * 当此 swf 已载完毕且已加载到舞台上时调用此函数。此类将在子类覆盖。
		 */
		protected function initialize():void {
			//在子类覆盖此函数
		}
	}
}